/* @flow */

import { toArray } from '../util/index'

export function initUse(Vue: GlobalAPI) {
  // plugin为用户传入的插件
  Vue.use = function (plugin: Function | Object) {
    // 判断此插件是否注册过（this._installedPlugins中是否有当前插件）
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // additional parameters
    // plugin传入的参数转为数组
    // 把数组中的第一个元素(plugin)去除
    const args = toArray(arguments, 1)
    // 将vue添加至第一个位置
    args.unshift(this)

    // 判断install属性是否为函数
    if (typeof plugin.install === 'function') {
      // 通过apply展开args传递参数
      // plugin.install(...args)
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      // 通过apply展开args传递参数
      plugin.apply(null, args)
    }
    // 将插件注册（当前为浅拷贝，会将值添加到 this._installedPlugins）
    installedPlugins.push(plugin)
    // 返回vue为了链式调用vue.use().use()
    return this
  }
}
/*
  // 使用时可以传入多个参数
  Vue.use(MyPlugin, a, b, c, ...)

  // MyPlugin可以为函数，函数会直接调用。对象，需要拥有install方法。
  // 会将传入的参数传递给自定义插件 MyPlugin(vue, a, b, c, ...)

*/